package otherapi.easyexcel.handler;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author LiDong
 * @version 1.0.0
 * @createTime 12/20/2022 3:42 PM
 */
public class CustomSheetWriteHandler implements SheetWriteHandler {

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        //定义一个map key是需要添加下拉框的列的index value是下拉框数据
        Map<Integer, String[]> mapDropDown = new HashMap<>(3);
        //设置单位身份 值写死
        String[] unitIdentity = {"职教集团成员单位", "拟合作单位", "合作单位"};
        //地区
        String[] area = {"国内", "国外"};
        //等级下拉选
        String[] level = {"国家级示范校", "国家级骨干校", "省级示范校", "省级骨干校", "其他"};
        //年份下拉选
        String[] joinYear = {"1990年", "1991年", "1992年", "1993年", "1994年", "1995年", "1996年", "1997年", "1998年",
                "1999年", "2000年", "2001年", "2002年", "2003年", "2004年", "2005年", "2006年", "2007年", "2008年", "2009年", "2010年", "2011年", "2012年",
                "2013年", "2014年", "2015年", "2016年", "2017年", "2018年", "2019年", "2020年", "2021年", "2022年"};
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 50000; i++) {
            list.add("test" + i);
        }
        Object[] tempArray = list.toArray();
        String[] strArray = new String[tempArray.length];
        for (int i = 0; i < tempArray.length; i++) {
            strArray[i] = String.valueOf(tempArray[i]);
        }


        Workbook workbook = writeWorkbookHolder.getWorkbook();
        //定义sheet的名称
        String sheetName = "省市区列表";
        //1.创建一个隐藏的sheet 名称为 proviceSheet
        Sheet proviceSheet = workbook.createSheet(sheetName);
        // 设置隐藏
        workbook.setSheetHidden(1, true);
        //2.循环赋值（为了防止下拉框的行数与隐藏域的行数相对应，将隐藏域加到结束行之后）
        for (int i = 0, length = strArray.length; i < length; i++) {
            // i:表示你开始的行数  0表示你开始的列数
            proviceSheet.createRow(i).createCell(0).setCellValue(strArray[i]);
        }
        Name category1Name = workbook.createName();
        category1Name.setNameName(sheetName);
        //4 $A$1:$A$N代表 以A列1行开始获取N行下拉数据
        category1Name.setRefersToFormula(sheetName + "!$A$1:$A$" + (strArray.length));


        //下拉选在Excel中对应的列
        // mapDropDown.put(0, strArray);
        mapDropDown.put(1, joinYear);
        mapDropDown.put(2, area);
        mapDropDown.put(3, level);
        //获取工作簿
        Sheet sheet = writeSheetHolder.getSheet();
        ///开始设置下拉框
        DataValidationHelper helper = sheet.getDataValidationHelper();

        //5 将刚才设置的sheet引用到你的下拉列表中
        DataValidationConstraint constraint8 = helper.createFormulaListConstraint(sheetName);
        CellRangeAddressList addressList1 = new CellRangeAddressList(1, 65535, 0, 0);
        DataValidation dataValidation3 = helper.createValidation(constraint8, addressList1);
        sheet.addValidationData(dataValidation3);

        //设置下拉框
        for (Map.Entry<Integer, String[]> entry : mapDropDown.entrySet()) {
            /*起始行、终止行、起始列、终止列  起始行为1即表示表头不设置**/
            CellRangeAddressList addressList = new CellRangeAddressList(1, 65535, entry.getKey(), entry.getKey());
            /*设置下拉框数据**/
            DataValidationConstraint constraint = helper.createExplicitListConstraint(entry.getValue());
            DataValidation dataValidation = helper.createValidation(constraint, addressList);
            sheet.addValidationData(dataValidation);
        }
    }
}
